#!/usr/bin/env python3.11
# -*- encoding: utf-8 -*-
"""
@File    :   response.py
@Time    :   2024/06/06 16:02:16
@Author  :   windstarry 
@Version :   1.0
"""
# here put the import lib
import orjson
from typing import Any, List

from ninja.renderers import JSONRenderer
from django.http import HttpRequest, HttpResponse
from ninja_extra import NinjaExtraAPI


class NinjaAPI(NinjaExtraAPI):
    def create_response(
        self,
        request: HttpRequest,
        data: Any,
        *,
        status: int = 200,
        code: int = 2000,
        msg: str = "success",
        temporal_response: HttpResponse = None,
    ) -> HttpResponse:
        """
        创建并返回一个HTTP响应。

        根据给定的请求、数据以及状态码、代码、消息等信息，生成一个标准的响应数据结构，
        然后通过渲染器将其渲染为具体的格式，最后返回一个包含渲染后内容的HTTP响应对象。

        参数:
        - request: HttpRequest对象，表示原始的HTTP请求。
        - data: 任意类型的对象，表示响应的数据部分。
        - status: int类型，可选，默认为200，表示HTTP响应的状态码。
        - code: int类型，可选，默认为2000，表示业务逻辑返回的代码。
        - msg: str类型，可选，默认为"success"，表示业务逻辑返回的消息。
        - temporal_response: HttpResponse对象，可选，默认为None，暂时未使用。

        返回:
        - HttpResponse对象，包含渲染后的数据、状态码和内容类型。
        """
        # 构建标准的响应数据结构
        std_data = {"code": code, "result": data, "message": msg, "success": True}
        # 使用渲染器将标准响应数据渲染为指定格式的内容
        content = self.renderer.render(request, std_data, response_status=status)
        # 构建响应的内容类型，包括媒体类型和字符集
        content_type = f"{self.renderer.media_type}; charset={self.renderer.charset}"
        # 返回包含渲染后内容、状态码和内容类型的HTTP响应对象
        return HttpResponse(content, status=status, content_type=content_type)


class ORJSONRenderer(JSONRenderer):
    def render(self, request: HttpRequest, data: Any, *, response_status: int) -> Any:
        # 初始化返回结果字典
        ret = {"code": response_status, "data": data, "success": False}

        # 如果data是字典类型
        if isinstance(data, dict):
            # 从data中取出'detail'字段作为'message',同时删除data中的'detail'字段,若不存在则默认为'请求成功'
            ret["message"] = data.pop("detail", "请求成功")
            if data.get("data"):
                data = data.get("data")
                ret["data"] = data

        # 如果response_status在200到299之间
        if 200 <= response_status < 300:
            # 设置ret中的'success'为True
            ret["success"] = True

        # 将ret字典序列化为JSON格式的字符串并返回
        return orjson.dumps(ret, **self.json_dumps_params)
